package com.jt.service;

import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;
import com.jt.vo.ImageVO;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.naming.SizeLimitExceededException;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageFilter;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    //定义根目录  windows系统采用该目录    Linux系统需要切换目录
    private  String preFilePath="D:/cgb21101/image";
    //定义网络地址前缀
    private String preURLPath= "http://image.jt.com";
    @Override
    @Transactional
    public ImageVO upload(MultipartFile file) {

        /**
         * 业务思路:
         *      1.校验图片的类型  jpg|png|gif
         *      2.校验是否为恶意程序 木马.exe.jpg
         *      3.将图片进行分目录存储  hash方式存储|时间格式存储
         *      4.防止图片重名,使用UUID.
         * @param file
         * @return
         */
        //第一步: 校验图片类型
        //1.获取文件名称  abc.JPG
        //2.bug: 文件名称大小写问题 全部转化为小写
        String filename=file.getOriginalFilename().toString();
        String zz="^.+\\.(jpg|png|gif)$";
        if(!filename.matches(zz)){
            //如果图片不满足条件,则程序终止
            return null;
        }
        //第二步: 校验是否为恶意程序
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int height=bufferedImage.getHeight();
            int width=bufferedImage.getWidth();
            if(height==0 || width==0){
                return null;
                //第三步: 分目录存储 提高检索的效率  按照时间将目录划分 /yyyy/MM/dd/
            }
            //第三步: 分目录存储 提高检索的效率  按照时间将目录划分 /yyyy/MM/dd/
            String datePath = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            String fileDir=preFilePath+datePath;

            //创建目录
            File dirFile=new File(fileDir);
            if(!dirFile.exists()){
                dirFile.mkdirs();//目录没有的时候,应该创建目录
            }
            //第四步: 防止文件重名
            String uuid = UUID.randomUUID().toString().replace("-", "");
            int index=filename.lastIndexOf(".");
            //获取数据 .jpg
            String fileType=filename.substring(index);
            //新文件名称
            filename=uuid+fileType;
            //第五步: 实现文件上传
            String filePath=fileDir+filename;
            file.transferTo(new File(filePath));
            //第六步: 封装ImageVO返回数据    /2022/01/10/uuid.jpg
            String virtualPath=datePath+filename;
            //第七步: 封装网络地址 http://image.jt.com/2022/01/10/uuid.jpg
            String urlPath=preURLPath+virtualPath;
            System.out.println(urlPath);
            return new ImageVO(virtualPath, urlPath, filename);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }



    }

    @Override
    public void deleteFile(String virtualPath) {
        String file = preFilePath + virtualPath;
        File file1 = new File(file);
        if (!file1.exists()) {
            file1.delete();
        }
    }
}
